home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 2 / Deutsche Edition 2.iso / mac / POWERMAC / C64 / SOURCE / Keyboard.c < prev    next >
Text File  |  1994-06-06  |  6KB  |  238 lines

  1. /*
  2.     Commodore 64 Emulator v0.4      Earle F. Philhower III 
  3.     Copyright (C) 1993-4            (st916w9r@dunx1.ocs.drexel.edu)
  4.  
  5.     This program is free software; you can redistribute it and/or modify
  6.     it under the terms of the GNU General Public License as published by
  7.     the Free Software Foundation; either version 2 of the License, or
  8.     (at your option) any later version.
  9.  
  10.     This program is distributed in the hope that it will be useful,
  11.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.     GNU General Public License for more details.
  14.  
  15.     You should have received a copy of the GNU General Public License
  16.     along with this program; if not, write to the Free Software
  17.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. */
  19.  
  20. #include "Processor.h"
  21. #include "Keyboard.h"
  22. #include "Stack.h"
  23.  
  24. byte keyScan[8];
  25. byte scanCode[256];
  26.  
  27. static void SetupScanCodes()
  28. {
  29.     int x;
  30.     byte y, z;
  31.     
  32.     for (x=0; x<256; x++)
  33.     {
  34.         z=255;
  35.         y=x^255;
  36.         if (y&1) z &=keyScan[0];
  37.         if (y&2) z &=keyScan[1];
  38.         if (y&4) z &=keyScan[2];
  39.         if (y&8) z &=keyScan[3];
  40.         if (y&16) z &=keyScan[4];
  41.         if (y&32) z &=keyScan[5];
  42.         if (y&64) z &=keyScan[6];
  43.         if (y&128) z &=keyScan[7];
  44.         scanCode[x]=z;
  45.     }
  46. }
  47.  
  48. void AppleScanKeyboard(byte chr, int modifiers)
  49. {
  50.     /* Clear out the scancodes */
  51.     keyScan[0]=keyScan[1]=keyScan[2]=keyScan[3]=keyScan[4]=keyScan[5]=keyScan[6]=keyScan[7]=255;
  52.     
  53.     if (chr==13)
  54.     {
  55.         /* RETURN */
  56.         keyScan[0] -=2;
  57.         if (modifiers&shiftKey) keyScan[1]-=128;
  58.         SetupScanCodes();
  59.         return;
  60.     }
  61.     
  62.     if (chr==0x08)
  63.     {
  64.         /* DELETE */
  65.         keyScan[0] -= 1;
  66.         if (modifiers&shiftKey) keyScan[1]-=128;
  67.         SetupScanCodes();
  68.         return;
  69.     }
  70.     
  71.     if (chr==0x1b)
  72.     {
  73.         /* RUN/STOP */
  74.         keyScan[7]-=128;
  75.         SetupScanCodes();
  76.         return;
  77.     }
  78.     
  79.     if (chr=='`')
  80.     {
  81.         /* RUN/STOP - RESTORE */
  82.         keyScan[7]-=128;
  83.         PushWord(pc);
  84.         Push(flags);
  85.         pc=WordAt(NMITo);
  86.         SetupScanCodes();
  87.         return;
  88.     }
  89.  
  90.     if (modifiers&optionKey)
  91.     {
  92.         switch(chr)
  93.         {
  94.         /* F1, F2 */
  95.         case 0xaa: keyScan[1]-=128;
  96.         case 0xc1: keyScan[0]-=16; break;
  97.         
  98.         /* F3, F4 */
  99.         case 0xa2: keyScan[1]-=128;
  100.         case 0xa3: keyScan[0]-=32; break;
  101.     
  102.         /* F5, F6 */
  103.         case 0xa4: keyScan[1]-=128;
  104.         case 0xb0: keyScan[0]-=64; break;
  105.     
  106.         /* F7, F8 */
  107.         case 0xa5: keyScan[1]-=128;
  108.         case 0xa6: keyScan[0]-=8; break;
  109.         }
  110.         SetupScanCodes();
  111.         return;
  112.     }
  113.  
  114.     if (chr==' ')
  115.     {
  116.         /* SPACE */
  117.         if (modifiers&shiftKey) keyScan[1]-=128;
  118.         keyScan[7]-=16;
  119.         SetupScanCodes();
  120.         return;
  121.     }
  122.  
  123.     if ((chr>=1)&&(chr<=26))
  124.     {
  125.         /* Make CONTROL down, munge the chars up into ASCII for following */
  126.         keyScan[7]-=4;
  127.         chr +=64+32;
  128.     }
  129.     
  130.     if (((chr>='A')&&(chr<='Z'))||((chr>='a')&&(chr<='z')))
  131.     {
  132.         if (chr<'a') keyScan[1] -= 128;
  133.         else chr -=32;
  134.         
  135.         switch (chr)
  136.         {
  137.         case 'A' : keyScan[1]-=4; break;
  138.         case 'B' : keyScan[3]-=16; break;
  139.         case 'C' : keyScan[2]-=16; break;
  140.         case 'D' : keyScan[2]-=4; break;
  141.         case 'E' : keyScan[1]-=64; break;
  142.         case 'F' : keyScan[2]-=32; break;
  143.         case 'G' : keyScan[3]-=4; break;
  144.         case 'H' : keyScan[3]-=32; break;
  145.         case 'I' : keyScan[4]-=2; break;
  146.         case 'J' : keyScan[4]-=4; break;
  147.         case 'K' : keyScan[4]-=32; break;
  148.         case 'L' : keyScan[5]-=4; break;
  149.         case 'M' : keyScan[4]-=16; break;
  150.         case 'N' : keyScan[4]-=128; break;
  151.         case 'O' : keyScan[4]-=64; break;
  152.         case 'P' : keyScan[5]-=2; break;
  153.         case 'Q' : keyScan[7]-=64; break;
  154.         case 'R' : keyScan[2]-=2; break;
  155.         case 'S' : keyScan[1]-=32; break;
  156.         case 'T' : keyScan[2]-=64; break;
  157.         case 'U' : keyScan[3]-=64; break;
  158.         case 'V' : keyScan[3]-=128; break;
  159.         case 'W' : keyScan[1]-=2; break;
  160.         case 'X' : keyScan[2]-=128; break;
  161.         case 'Y' : keyScan[3]-=2; break;
  162.         case 'Z' : keyScan[1]-=16; break;
  163.         }
  164.         SetupScanCodes();
  165.         return;
  166.     }
  167.     else if ((chr>='0')&&(chr<='9'))
  168.     {
  169.         switch(chr)
  170.         {
  171.             case '0': keyScan[4]-=8; break;
  172.             case '1': keyScan[7]-=1; break;
  173.             case '2': keyScan[7]-=8; break;
  174.             case '3': keyScan[1]-=1; break;
  175.             case '4': keyScan[1]-=8; break;
  176.             case '5': keyScan[2]-=1; break;
  177.             case '6': keyScan[2]-=8; break;
  178.             case '7': keyScan[3]-=1; break;
  179.             case '8': keyScan[3]-=8; break;
  180.             case '9': keyScan[4]-=1; break;
  181.         }
  182.         SetupScanCodes();
  183.         return;
  184.     }
  185.     else if ((chr>=0x1c)&&(chr<=0x1f))
  186.     {
  187.         switch (chr)
  188.         {
  189.             /* UP/DOWN */
  190.             case 0x1c: keyScan[1] -=128;
  191.             case 0x1d: keyScan[0] -=4; break;
  192.             /* LEFT/RIGHT */
  193.             case 0x1e: keyScan[1] -=128;
  194.             case 0x1f: keyScan[0] -=128; break;
  195.         }
  196.         SetupScanCodes();
  197.         return;
  198.     }
  199.     else if ((chr>='!')&&(chr<='/'))
  200.     {
  201.         switch (chr)
  202.         {
  203.         case '!': keyScan[1] -=128; keyScan[7] -=1; break;
  204.         case '"': keyScan[1] -=128; keyScan[7] -=8; break;
  205.         case '#': keyScan[1] -=128; keyScan[1] -=1; break;
  206.         case '$': keyScan[1] -=128; keyScan[1] -=8; break;
  207.         case '%': keyScan[1] -=128; keyScan[2] -=1; break;
  208.         case '&': keyScan[1] -=128; keyScan[2] -=8; break;
  209.         case 39 : keyScan[1] -=128; keyScan[3] -=1; break;
  210.         case '(': keyScan[1] -=128; keyScan[3] -=8; break;
  211.         case ')': keyScan[1] -=128; keyScan[4] -=1; break;
  212.         case '*': keyScan[6] -=2; break;
  213.         case '+': keyScan[5] -=1; break;
  214.         case ',': keyScan[5] -=128; break;
  215.         case '-': keyScan[5] -=8; break;
  216.         case '.': keyScan[5] -=16; break;
  217.         case '/': keyScan[6] -=128; break;
  218.         }
  219.         SetupScanCodes();
  220.         return;
  221.     }
  222.     else if ((chr>=':')&&(chr<='@')) 
  223.     {
  224.         switch (chr)
  225.         {
  226.         case ';': keyScan[6]-=4;
  227.         case ':': keyScan[5]-=32; break;
  228.         case '<': keyScan[1]-=128; keyScan[5]-=128; break;
  229.         case '=': keyScan[6]-=32; break;
  230.         case '>': keyScan[1]-=128; keyScan[5]-=16; break;
  231.         case '?': keyScan[1]-=128; keyScan[6]-=128; break;
  232.         case '@': keyScan[5]-=64; break;
  233.         }
  234.         SetupScanCodes();
  235.         return;
  236.     }
  237. }
  238.